В этом шаге мы рассмотрим рисование треугольников и их закраску.
Давайте как обычно создадим проект, добавим к классу C...View две переменные m_iMode и m_iFlat. В конструкторе класса проинициализируем их.
Добавим в меню View два новых подменю Triangle Color Mode и Triangle Shade Mode c соответствующими идентификаторами.
Напишем функции-обработчики этих меню:
void CExampleView::OnTriagColorMode()
{
// TODO: Add your command handler code here
if(m_iMode==1)
m_iMode = 0;
else
m_iMode = 1;
InvalidateRect(NULL, FALSE);
}
void CExampleView::OnTriagShadeMode()
{
// TODO: Add your command handler code here
if(m_iFlat==1)
m_iFlat = 0;
else
m_iFlat = 1;
InvalidateRect(NULL, FALSE);
}
Логика действия очевидна, описывать не буду.
Теперь рассмотрим самую главную для нас функцию - OnDraw(...):
void CExampleView::OnDraw(CDC* pDC)
{
CRect clientRect;
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
GetClientRect(&clientRect);
glViewport(0, 0, clientRect.right, clientRect.bottom);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
glLineWidth (20); // размер точек
glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов
switch(m_iFlat)
{
case 0:
glShadeModel(GL_FLAT);
break;
case 1:
glShadeModel(GL_SMOOTH);
break;
}
switch(m_iMode)
{
case 0:
glBegin (GL_TRIANGLES);
glVertex2f(0,0.5);
glVertex2f(0.5,-0.5);
glVertex2f(-0.5,-0.5);
glEnd();
break;
case 1:
glBegin (GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0,0.5);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.5,-0.5);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(-0.5,-0.5);
glEnd();
break;
}
}
Попереключайте меню в разных комбинациях.
Наиболее интересная позиция - режим GL_FLAT + многоцветный треугольник. Результат на первый взгляд странный - треугольник синий.
Но если посмотреть внимательно, то последняя окрашиваемая вершина треугольника синяя.
Более того, если вы нарисуете несколько треугольников в режиме STRIP или FAN (их мы рассмотрим в следующем шаге), то все они будут нарисованы цветом последнего из них. Этот момент станет более понятным после того, как мы перейдем к 3-х мерным координатам.